/*	Date:2017/7/29
 *	Author: Chunsheng Chen
 *	功能： 提供环境的构造。也就是标志是变量还是函数名

 更新日志：2017-7-31 10:20:26
	1、尝试添加函数定义。 #include"absyn.h"
	2、取消定义结构体时候，需要分号结尾
 */

#ifndef _CCS_ENV_H_
#define _CCS_ENV_H_

#include"type.h"
#include"table.h"
#include"absyn.h"
/*
结构名：E_enventry
功能：记录标识符对应的值
成员： kind: E_var为变量 E_fun为函数
	u: 储存对应的值
*/
struct E_enventry{
	enum {E_var, E_fun} kind;
	union {
	 struct valtype* var;
	 struct funfield{   
		 struct CM_stmtlist* stmt;
		 struct CM_vardeclist* params; 
	 	 struct valtype* result; 
	 }*fun;
	}u;
};

//构造变量
struct E_enventry* E_varEntry(struct valtype*);

//构造函数
struct E_enventry* E_funEntry(struct CM_vardeclist*, struct valtype*, struct CM_stmtlist*);

//提供最初始的类型环境
struct table* E_base_type_env();

//提供最初始的值环境
struct table* E_base_value_env();

//显示具体环境下的某个变量的类型
void showEnvType(void*, void*);

//显示具体环境下的某个变量的值
void showEnvValue(struct E_enventry* );


#endif
